package uva.sc.ql.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.junit.Assert;
import org.junit.Test;
import uva.sc.core.errors.IError;
import uva.sc.core.warnings.IWarning;
import uva.sc.ql.ast.IQLFormNode;
import uva.sc.ql.atom.ID;
import uva.sc.ql.gui.QuestionnaireForm;
import uva.sc.ql.parser.ASTGeneratorVisitor;
import uva.sc.ql.parser.QLErrorListener;
import uva.sc.ql.parser.QLGrammarLexer;
import uva.sc.ql.parser.QLGrammarParser;
import uva.sc.ql.patronElements.PatronQuestionsVisitor;
import uva.sc.ql.typeChecker.TypeCheckerVisitor;
public class QLIntegration {
@Test
public void testSyntaxErrors() throws IOException {
File file = new File("form/test/test1.grammar");
CharStream in = new ANTLRFileStream(file.getAbsolutePath());
QLGrammarLexer lexer = new QLGrammarLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
QLGrammarParser parser = new QLGrammarParser(tokens);
parser.removeErrorListeners();
QLErrorListener syntaxErrorListener = new QLErrorListener();
parser.addErrorListener(syntaxErrorListener);
@SuppressWarnings("unused")
ParseTree tree = parser.form();
List<IError> syntaxErrors = syntaxErrorListener.getErrors();
int syntaxErrorsAmount = syntaxErrors.size();
Assert.assertTrue(
"Assertion failed. Expected 3 syntax errors, but got "
+ syntaxErrorsAmount, syntaxErrorsAmount == 3);
}
@Test
public void testTypeCheckingErrors() throws IOException {
File file = new File("form/test/test2.grammar");
ParseTree tree = generateTree(file);
ASTGeneratorVisitor visitor = new ASTGeneratorVisitor();
IQLFormNode questionnaire = (IQLFormNode) visitor.visit(tree);
TypeCheckerVisitor typeChecker = new TypeCheckerVisitor();
questionnaire.accept(typeChecker);
List<IError> typeCheckerErrors = typeChecker.getErrors();
int typeCheckerErrorsAmount = typeCheckerErrors.size();
Assert.assertTrue(
"Assertion failed. Expected 2 type checking errors, but got "
+ typeCheckerErrorsAmount, typeCheckerErrorsAmount == 2);
}
@Test
public void testTypeCheckingWarnings() throws IOException {
File file = new File("form/test/test3.grammar");
ParseTree tree = generateTree(file);
ASTGeneratorVisitor visitor = new ASTGeneratorVisitor();
IQLFormNode questionnaire = (IQLFormNode) visitor.visit(tree);
TypeCheckerVisitor typeChecker = new TypeCheckerVisitor();
questionnaire.accept(typeChecker);
List<IWarning> typeCheckerWarings = typeChecker.getWarnings();
int typeCheckerWarningsAmount = typeCheckerWarings.size();
Assert.assertTrue(
"Assertion failed. Expected 1 type checking warning, but got "
+ typeCheckerWarningsAmount,
typeCheckerWarningsAmount == 1);
}
@Test
public void testPatronQuestions() throws IOException {
File file = new File("form/test/test3.grammar");
ParseTree tree = generateTree(file);
ASTGeneratorVisitor visitor = new ASTGeneratorVisitor();
IQLFormNode questionnaire = (IQLFormNode) visitor.visit(tree);
PatronQuestionsVisitor patronQuestionsVisitor = new PatronQuestionsVisitor();
questionnaire.accept(patronQuestionsVisitor);
Map<ID, List<ID>> patronQuestions = patronQuestionsVisitor
.getPatronElements();
int numberOfpatronElements = patronQuestions.size();
Assert.assertTrue(
"Assertion failed. Expected 4 patron questions, but got "
+ numberOfpatronElements, numberOfpatronElements == 4);
}
private ParseTree generateTree(File file) throws IOException {
QuestionnaireForm form = new QuestionnaireForm();
ParseTree tree = form.generateParseTree(file);
return tree;
}
}